/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package edu.ufes.gpf.sgm.presenter;

import edu.ufes.gpf.sgm.dao.MandadosDAOMySQL;
import edu.ufes.gpf.sgm.factoryMethodDinamico.FiltrosMandadosFactory;
import edu.ufes.gpf.sgm.model.Mandado;
import edu.ufes.gpf.sgm.observer.Observador;
import edu.ufes.gpf.sgm.state.listarMandados.AbstractStateListarMandados;
import edu.ufes.gpf.sgm.state.listarMandados.EstadoNaoSelecionadoMandados;
import edu.ufes.gpf.sgm.state.listarMandados.EstadoSelecionadoMandados;
import edu.ufes.gpf.sgm.strategy.filtrosMandados.IFiltroMandado;
import edu.ufes.gpf.sgm.view.ListarMandadosView;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.sql.SQLException;
import java.util.Collection;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import javax.swing.ListSelectionModel;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author Odair
 */
public class ListarMandadosPresenter implements Observador {

    private ListarMandadosView view;
    private MandadosDAOMySQL mandados;
    private Mandado mandado;
    private AbstractStateListarMandados estado;
    private IFiltroMandado filtro;

    public ListarMandadosPresenter() {
        view = new ListarMandadosView();

        try {
            mandados = MandadosDAOMySQL.getInstancia();
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(ListarMandadosPresenter.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(ListarMandadosPresenter.class.getName()).log(Level.SEVERE, null, ex);
        }

        mandados.addObserver(ListarMandadosPresenter.this);

        view.getTblListaMandados().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

        estado = new EstadoNaoSelecionadoMandados(this);

        view.getTblListaMandados().addMouseListener(new MouseAdapter() {
            @Override
            public void mouseReleased(MouseEvent e) {
                try {
                    setEstado(new EstadoSelecionadoMandados(ListarMandadosPresenter.this));
                } catch (Exception ex) {
                    JOptionPane.showMessageDialog(view, ex.getMessage());
                    Logger.getLogger(ListarMandadosPresenter.class.getName()).log(Level.SEVERE, null, ex);
                }

            }
        });

        view.getBtnSair().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                sair();
            }
        });

        view.getBtnVisualizarMandado().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                visualizar();
            }
        });

        view.getBtnNovoMandado().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                novo();
            }
        });

        view.getBtnExcluirMandado().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                excluir();
            }
        });

        view.getTxtFiltro().addKeyListener(new KeyAdapter() {
            @Override
            public void keyReleased(KeyEvent e) {
                filtrarMandados();
            }
        });

        preencherFiltros();
        carregarListaMandados(mandados.buscarTodos());

        view.setTitle("Lista de Mandados");
        view.setLocationRelativeTo(null);
        view.setVisible(true);
    }

    public ListarMandadosView getView() {
        return view;
    }

    public MandadosDAOMySQL getMandados() {
        return mandados;
    }

    public Mandado getMandado() {
        return mandado;
    }

    public AbstractStateListarMandados getEstado() {
        return estado;
    }

    public void setMandado(Mandado mandado) {
        this.mandado = mandado;
    }

    public void setEstado(AbstractStateListarMandados estado) {
        this.estado = estado;
    }

    private void novo() {
        estado.inclui();
    }

    private void visualizar() {
        estado.visualiza();
    }

    private void sair() {
        view.setVisible(false);
        view.dispose();
    }

    private void excluir() {
        estado.exclui();
    }

    private void filtrarMandados() {
        try {
            filtro = FiltrosMandadosFactory.create(view.getCbmFiltro().getSelectedItem().toString());
            filtro.filtrar(this);
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(view, ex.getMessage());
            Logger.getLogger(ListarMandadosPresenter.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

    private void preencherFiltros() {
        FiltrosMandadosFactory.carregaFiltros();
        for (Iterator<Object> it = FiltrosMandadosFactory.listaFiltros().iterator(); it.hasNext();) {
            String obj = (String) it.next();
            view.getCbmFiltro().addItem(obj.split("Mandado")[1]);
        }
    }

    public final void carregarListaMandados(Collection<Mandado> mandados) {
        DefaultTableModel dtm = (DefaultTableModel) view.getTblListaMandados().getModel();
        dtm.setNumRows(0);
        for (Iterator<Mandado> it = mandados.iterator(); it.hasNext();) {
            Mandado p = it.next();
            String linha = p.toString();
            String valores[] = linha.split("%");
            dtm.addRow(new Object[]{valores[0], valores[1], valores[2], valores[3], valores[4]});
        }

        view.getTblListaMandados().setModel(dtm);
    }

    @Override
    public void atualizar() {
        carregarListaMandados(mandados.buscarTodos());
        setEstado(new EstadoNaoSelecionadoMandados(this));
    }
}
